package main

import (
	"context"
	"fmt"
	"time"
)


func main() {
	ctx :=context.Background();
	// context1(ctx), fatal error: all goroutines are asleep - deadlock!
	go context1(ctx)
	time.Sleep(time.Millisecond*1000)
	// <-ctx.Done()  // 已经关闭的chan会报错,可能调用一次就自动变成nil了
	if ctx.Done()!=nil{
		_,ok:=<-ctx.Done()
		fmt.Print(ok)
		fmt.Println("not closed ")
	}
	fmt.Println("end!!!")
}

func context1(ctx context.Context){
	// Context实现超时取消，
	ctx, cancel := context.WithTimeout(ctx,time.Millisecond*500)
	// 函数执行完后手动取消，不用等待超时时间到
	defer cancel()
	fmt.Println(cancel)

	for{
		select{
		case <-ctx.Done():
			fmt.Println("game is over!!!!")
			return
		// 不可能执行到
		case <- time.After(1000*time.Millisecond):
			fmt.Println("程序运行了1000")
		}
	}
}